package fnsvr

import "time"

//时间日期处理

//判断两个utc毫秒时间戳是否属于同一天
func IsSameDay(loc *time.Location, t1, t2 int64) bool {
	time1 := time.Unix(t1/1000, 0).In(loc) // 转换为本地时间
	time2 := time.Unix(t2/1000, 0).In(loc) // 转换为本地时间

	y1, m1, d1 := time1.Date()
	y2, m2, d2 := time2.Date()

	return y1 == y2 && m1 == m2 && d1 == d2
}

// 获取毫秒时间戳
func GetMilliTimestamp() int64 {
	return time.Now().UTC().UnixNano() / 1e6
}

// 获得当天凌晨的毫秒时间戳
func GetTodayZero(loc *time.Location) int64 {
	return GetZeroMilliTimestamp(loc, time.Now())
}

// 计算一个utc时间距离指定的本地时间0点相差的秒数
func LocalZeroSeconds(loc *time.Location, utcTime time.Time) int64 {

	// 获取本地时区今日0点时间
	now := time.Now().In(loc)
	todayZero := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, loc)

	// 计算时间差（秒数）
	diffSeconds := int64(utcTime.Sub(todayZero).Seconds())
	return diffSeconds
}

// 获取指定时间，在指定时区的当天0点UTC毫秒时间戳
func GetZeroMilliTimestamp(loc *time.Location, utcTime time.Time) int64 {
	now := utcTime.In(loc)
	todayZero := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, loc)
	return todayZero.UTC().UnixNano() / 1e6
}

//获取年月日 例  20250811
func GetYMD(loc *time.Location, utcTime time.Time) int64 {
	now := utcTime.In(loc)
	return int64(now.Year())*10000 + int64(now.Month())*100 + int64(now.Day())
}

// 把一个毫秒时间戳转换为UTC time.Time
func MilliTimestampToTime(milliseconds int64) time.Time {
	// 将毫秒转换为纳秒（因为time.Time是基于纳秒的）
	nanoseconds := milliseconds * int64(time.Millisecond)

	// 使用time.Unix()方法创建一个time.Time对象。
	// time.Unix()需要一个秒数的时间戳和一个纳秒数（在这个例子中是多余的，因为我们稍后会调整它）。
	// 然后我们使用time.Unix(0, nanoseconds)来确保我们使用的是正确的纳秒值。
	return time.Unix(0, nanoseconds)
}

//  毫秒时间戳在指定时区,返回[1,7] 1代表周1 7代表周日
func GetWeekdayInTimezoneWithMilliTimestamp(loc *time.Location, utcMillis int64) int {
	seconds := utcMillis / 1000
	nanos := (utcMillis % 1000) * 1e6
	utcTime := time.Unix(seconds, nanos)

	return GetWeekdayInTimezoneWithTime(loc, utcTime)
}

// 指定时间在指定时区是周几，返回[1,7] 1代表周1 7代表周日
func GetWeekdayInTimezoneWithTime(loc *time.Location, utcTime time.Time) int {
	localTime := utcTime.In(loc)
	weekday := localTime.Weekday()
	var weekdayNumber int
	if weekday == time.Sunday {
		weekdayNumber = 7
	} else {
		weekdayNumber = int(weekday)
	}

	return weekdayNumber
}

// 时间天数差
func DaysBetween(loc *time.Location, utcCurrTime, utcLastTime time.Time) int64 {

	if loc == nil {
		loc = time.UTC
	}

	// 转换为本地时间并规范化到当天的00:00:00
	locCurrTime := utcCurrTime.In(loc)
	locLastTime := utcLastTime.In(loc)

	// 截取日期部分(去除时间部分)
	date1 := time.Date(
		locLastTime.Year(),
		locLastTime.Month(),
		locLastTime.Day(),
		0, 0, 0, 0,
		loc,
	)

	date2 := time.Date(
		locCurrTime.Year(),
		locCurrTime.Month(),
		locCurrTime.Day(),
		0, 0, 0, 0,
		loc,
	)

	// 计算时间差
	diff := date2.Sub(date1)
	days := int64(diff.Hours() / 24)

	return days
}
